#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");

#define IRQ_NUM 123
static struct workqueue_struct *example_wq;
static struct work_struct example_work;

// 定义工作函数
static void example_work_handler(struct work_struct *work)
{
    // 这里写下半部的处理逻辑
    printk(KERN_INFO "example work queue handler\n");
}

// 中断服务程序处理函数
static irqreturn_t test_interrupt_handler(int irq, void *dev_id)
{
    // 这里写上半部的处理逻辑
    // ...

    // 把工作推入工作队列
    queue_work(example_wq, &example_work);

    return IRQ_HANDLED;
}

// 模块初始化函数
static int __init test_init(void)
{
    int ret = 0;

    printk(KERN_INFO "test_init\n");

    // 创建工作队列
    example_wq = create_workqueue("example_wq1");
    if (!example_wq) {
        ret = -ENOMEM;
        goto out;
    }

    // 初始化工作
    INIT_WORK(&example_work, example_work_handler);

    // 注册中断服务程序
    ret = request_irq(IRQ_NUM, test_interrupt_handler, IRQF_SHARED, "example_irq", NULL);
    if (ret) {
        printk(KERN_ERR "Failed to request IRQ %d\n", IRQ_NUM);
        goto out;
    }

out:
    return ret;
}

// 模块卸载函数
static void __exit test_exit(void)
{
    // 取消中断服务程序的注册
    free_irq(IRQ_NUM, NULL);

    // 回收工作队列
    if (example_wq) {
        flush_workqueue(example_wq);
        destroy_workqueue(example_wq);
    }
    printk(KERN_INFO "test_exit\n");
}

module_init(test_init);
module_exit(test_exit);

